package com.hpsk.shopstart.handler;

import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.hpsk.common.RespResult;
import com.hpsk.common.RespUtils;
import com.hpsk.utils.CommonServletUtil;
import jakarta.validation.ConstraintViolation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpMethod;
import org.springframework.validation.BindingResult;
import org.springframework.web.HttpRequestMethodNotSupportedException;

import java.util.Set;
import java.util.stream.Collectors;

/**
 * 全局异常处理工具类，将异常转为通用结果
 *
 * @author 李大鹏
 * @since 2023-05-31 12:32
 */
@Slf4j
public class GlobalExceptionUtil {

    /**
     * 根据错误类型获取对应的CommonResult
     *
     * @author 李大鹏
     * @since 2023-05-31 12:32
     **/
    public static RespResult<String> getCommonResult(Exception e) {
        RespResult<String> commonResult = new RespResult<>();

        // 如果是请求方法异常 405
        String method = CommonServletUtil.getRequest().getMethod();

        commonResult = RespUtils.err(HttpStatus.HTTP_UNAUTHORIZED, "登录token失效，请重新登录");


        return commonResult;
    }

    /**
     * 获取请求参数不正确的提示信息，多个信息，拼接成用逗号分隔的形式
     *
     * @author 李大鹏
     * @since 2023-05-31 12:32
     **/
    public static String getArgNotValidMessage(Set<ConstraintViolation<?>> constraintViolationSet) {
        if (CollectionUtils.isEmpty(constraintViolationSet)) {
            return StringUtils.EMPTY;
        }
        // 多个错误用逗号分隔
        return constraintViolationSet.stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.joining(StrPool.COMMA));
    }

    /**
     * 获取请求参数不正确的提示信息，多个信息，拼接成用逗号分隔的形式
     *
     * @author 李大鹏
     * @since 2023-05-31 12:32
     **/
    public static String getArgNotValidMessage(BindingResult bindingResult) {
        if (ObjectUtil.isNull(bindingResult)) {
            return StringUtils.EMPTY;
        }
        // 多个错误用逗号分隔
        return bindingResult.getAllErrors()
                .stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.joining(StrPool.COMMA));
    }

    /**
     * 流程异常,先判断是否是版本不对
     */
}
